<?php

/**
 * Проверяет значение ответа на соответствие типу соответствующего вопроса.
 *
 */
class Security_Validator_Answer extends Kernel_Validator_Abstract
{
    /**
     * Позиция поля, к которому относится проверяемое значение.
     *
     * @var integer
     */
    public $position;

    /**
     * Функция обратного вызова для получения типа значения для проверки.
     *
     * @var callback
     */
    public $callback;

    /**
     * Проверяет правильность указанного значения
     *
     * @param   mixed   $value
     * @throws  Kernel_Validator_Exception
     */
    protected function _validate($value)
    {
        if (is_array($params = $this->_getParams()))
        {
            list($pattern, $message) = $params;

            if (!preg_match($pattern, $value))
            {
                $this->_error(__($message));
            }
        }
    }

    /**
     * Возвращает параметры проверки
     *
     * @return  array
     */
    private function _getParams()
    {
        switch (call_user_func($this->callback, $this->position))
        {
            case '4digits':
                // четыре цифры
                $pattern = '/^\d{4}$/';
                $message = 'VALIDATION_ERROR_ANSWER_4DIGITS';
                break;

            case 'string':
                // разрешаем вводить буквы, пробелы и дефис
                $pattern = '/^[\p{L} \-]+$/u';
                $message = 'VALIDATION_ERROR_ANSWER_STRING';
                break;

            default:
                return null;
                break;
        }

        return array($pattern, $message);
    }
}
